<?php

class LiquidacionController extends Zend_Controller_Action {

    public function init() {
        /* Initialize action controller here */
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {
        X\Permiso::paraAction('Listar.Liquidaciones');
        $qb = $this->em->createQueryBuilder();
        $liquidaciones = $qb
                ->select('l.fecha')
                ->addselect('u.idUsuario')
                ->addselect('u.nombre')
                ->addselect('u.apellido')
                ->addselect('sum(l.importe) as importe')
                ->addselect('sum(l.horas) as horas')
                ->from('Default_Model_Liquidacion', 'l')
                ->join('l.responsable','r')
                ->join('r.profesor','p')
                ->join('p.usuario','u')
                ->where("l.estado = 'p'")
                ->addGroupBy('u.idUsuario')
                ->addGroupBy('l.fecha')
                ->orderBy('l.fecha', 'desc')
                ->addorderBy('u.nombre', 'asc')
                ->addorderBy('u.apellido', 'asc')
                ->setFirstResult(0)
                ->setMaxResults(20)
                ->getQuery()
                ->execute();
        $profesores = $this->em->createQueryBuilder()
            ->select('u.nombre')
            ->from('Default_Model_Liquidacion', 'l')
            ->join('l.responsable','r')
            ->join('r.profesor','p')
            ->join('p.usuario','u')
            ->where("l.estado = 'p'")
            ->groupBy('u.idUsuario')
            ->addGroupBy('l.fecha')
            ->getQuery()
            ->execute();

        $inicioliquidacion = $this->em->createQueryBuilder()
                ->select('c.valor')
                ->from('Default_Model_Configuracion', 'c')
                ->where("c.nombre='inicio_liquidacion'")
                ->getQuery()
                ->getSingleResult();

        foreach ($liquidaciones as &$ld) {
            $ld['fecha'] = $ld['fecha']->format('Y-m-d');
            $ld['estado'] = $ld['estado'] == 'p' ? 'Pendiente' : 'Liquidado';
            $ld['responsable'] = $ld['nombre'].' '.$ld['apellido'];
            $ld['importe'] = number_format($ld['importe']);
        }

        $this->view->jsoninicio= $inicioliquidacion['valor'];

        $this->view->jsondata = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($profesores),
                    "rows" => $liquidaciones
                ));

    }

    public function ajaxDetallarAction(){
        // las liquidaciones de quién obtendremos
        $usuario = $this->_request->getPost("idUsuario");
        // cuándo fue generada la liquidación
        $fecha = $this->_request->getPost("fecha");

        $qb = $this->em->createQueryBuilder();
        $detalles = $qb
            ->select('sum(c.montoPago*reg.horasCatedra) as importe')
            ->addselect('sum(reg.horasCatedra) as horas')
            ->addselect('reg.seccion')
            ->addselect('m.nombre as materia')
            ->addselect('c.nombre as categoria')
            ->from('Default_Model_Liquidacion', 'l')
            ->join('l.registros','reg')
            ->join('reg.materia','m')
            ->join('l.responsable','r')
            ->join('r.profesor','p')
            ->join('p.usuario','u')
            ->join('r.categoria','c')
            ->groupBy('reg.seccion')
            ->addGroupBy('m.idMateria')
            ->addGroupBy('c.idCategoria')
            ->addGroupBy('u.idUsuario')
            ->addGroupBy('l.idLiquidacion')
            ->where("l.estado = 'p'")
            ->andWhere("u.idUsuario = '".$usuario."'")
            ->andWhere("l.fecha = '".$fecha."'")
            ->getQuery()
            ->execute();

        foreach ($detalles as &$ld) {
            $ld['importe'] = number_format($ld['importe']);
        }

        echo X\Msg::Escape(Zend_Json::encode(Array(
            "success" => true,
            "results" => count($detalles),
            "rows" => $detalles
        )));
    }

    public function ajaxListarAction() {
        // parametro
        X\Permiso::paraAction('Listar.Liquidaciones');
        $start = $this->_request->getPost("start");
        $limit = $this->_request->getPost("limit");
        $sort = $this->_request->getPost("sort");
        $dir = $this->_request->getPost("dir");

        // paginacion
        $start = isset($start) ? $start : 0;
        $limit = isset($limit) ? $limit : 20;
        $sort = isset($sort) ? $sort : 'fecha';
        $dir = isset($dir) ? $dir : 'asc';
        $pref = 'l.';

        $liquidaciones = $this->em->createQueryBuilder()
                ->select('l.fecha')
                ->addselect('u.idUsuario')
                ->addselect('u.nombre')
                ->addselect('u.apellido')
                ->addselect('sum(l.importe) as importe')
                ->addselect('sum(l.horas) as horas')
                ->from('Default_Model_Liquidacion', 'l')
                ->join('l.responsable','r')
                ->join('r.profesor','p')
                ->join('p.usuario','u')
                ->where("l.estado = 'p'")
                ->groupBy('u.idUsuario')
                ->addGroupBy('l.fecha');

        switch($sort){
            case 'responsable':
                $liquidaciones = $liquidaciones
                    ->orderBy('u.nombre', pg_escape_string($dir))
                    ->addOrderBy('u.apellido', pg_escape_string($dir))
                    ->setFirstResult(pg_escape_string($start))
                    ->setMaxResults(pg_escape_string($limit))
                    ->getQuery()
                    ->execute();
                break;
            case 'fecha':
                $liquidaciones = $liquidaciones
                    ->orderBy(pg_escape_string($pref . $sort), pg_escape_string($dir))
                    ->setFirstResult(pg_escape_string($start))
                    ->setMaxResults(pg_escape_string($limit))
                    ->getQuery()
                    ->execute();
                break;
            default:
                $liquidaciones = $liquidaciones
                    ->setFirstResult(pg_escape_string($start))
                    ->setMaxResults(pg_escape_string($limit))
                    ->getQuery()
                    ->execute();
                break;
        }

        $profesores = $this->em->createQueryBuilder()
            ->select('u.nombre')
            ->from('Default_Model_Liquidacion', 'l')
            ->join('l.responsable','r')
            ->join('r.profesor','p')
            ->join('p.usuario','u')
            ->where("l.estado = 'p'")
            ->groupBy('u.idUsuario')
            ->addGroupBy('l.fecha')
            ->getQuery()
            ->execute();

        foreach ($liquidaciones as &$ld) {
            $ld['fecha'] = $ld['fecha']->format('Y-m-d');
            $ld['estado'] = $ld['estado'] == 'p' ? 'Pendiente' : 'Liquidado';
            $ld['responsable'] = $ld['nombre'].' '.$ld['apellido'];
            $ld['importe'] = number_format($ld['importe']);
        }
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($profesores),
            "rows" => $liquidaciones
        ));
    }

    public function ajaxCargarregistrosAction() {
        $idLiquidacion = $this->_request->getPost('idLiquidacion');
        $registros = $this->em->createQueryBuilder()
                ->select('r.idRegistro')
                ->addselect('r.fecha')
                ->addselect('r.horaFin')
                ->addselect('r.horascatedra')
                ->addselect('r.estado')
                ->addselect('p.responsable')
                ->addselect('c.curso')
                ->from('Default_Model_Registro', 'r')
                ->join('r.responsable', 're')
                ->join('r.liquidacion')
                ->join('re.profesor', 'p')
                ->join('re.usuario')
                ->where('')
                //->andWhere('r.fecha<=',$fin)
                ->getQuery()
                ->execute();
    }

    public function ajaxCalcularAction() {
        $inicio = $this->_request->getPost('inicio');
        $fin = $this->_request->getPost('fin');

        if(strtotime(str_replace("/","-",$inicio)) > strtotime(str_replace("/","-",$fin))){
            X\Msg::Failure("La fecha de fin debe ser posterior o igual a la fecha de inicio.");
            return;
        }

        $qb = $this->em->createQueryBuilder();

        // obtenemos los registros de asistencia en el rango de fecha especificado
        $registros = $qb
                ->select('r')
                ->from('Default_Model_Registro', 'r')
                ->where($qb->expr()->between('r.fecha', "'" . $inicio . "'", "'" . $fin . "'"))
                // no hay conflictos
                ->andWhere("r.estado = 'N'")
                ->orderBy("r.responsable")
                ->getQuery()
                ->execute();

        if (count($registros) > 0) {
            $responsable_actual = '';

            $horasT = 0;
            $importeT = 0;
            $liquidacion = new Default_Model_Liquidacion();

            foreach ($registros as $registro) {
                $responsable = $registro->getResponsable();

                // nuevo registro de liquidaciones
                if($responsable != $responsable_actual){
                    // si no es el primer registro, se crea en la base de datos el registro de liquidación anterior.
                    if($responsable_actual != ''){
                        $liquidacion->setImporte(round($importeT));
                        $liquidacion->setHoras($horasT);
                        $liquidacion->setFecha(date("d/m/Y"));
                        $this->em->persist($liquidacion);

                        $liquidacion = new Default_Model_Liquidacion();
                    }

                    $categoria = $responsable->getCategoria();

                    // se inicializan los datos de la liquidación.
                    $liquidacion->setFechaInicio($inicio);
                    $liquidacion->setFechaFin($fin);
                    //Pendiente p  Liquidado L
                    $liquidacion->setEstado('p');
                    $liquidacion->setImporte(0);
                    $liquidacion->setHoras(0);
                    $liquidacion->setResponsable($responsable);

                    $horasT = 0;
                    $importeT = 0;

                    // nuevo responsable
                    $responsable_actual = $responsable;
                }

                $horasreg = $registro->getHorasCatedra();
                $importereg = $horasreg * $categoria->getMontoPago();
                $horasT += $horasreg;
                $importeT += $importereg;

                // registro asociado a la liquidación
                $registro->setLiquidacion($liquidacion);
                $this->em->persist($registro);
            }

            // último registro
            $liquidacion->setImporte(round($importeT));
            $liquidacion->setHoras($horasT);
            $liquidacion->setFecha(date("d/m/Y"));
            $this->em->persist($liquidacion);

            $ini = "inicio_liquidacion";
            $inicioliquidacion = $this->em->createQueryBuilder()
                    ->select('c.idConfiguracion')
                    ->from('Default_Model_Configuracion', 'c')
                    ->where("c.nombre='" . $ini . "'")
                    ->getQuery()
                    //->execute();
                    ->getSingleResult();
            $ini = $this->em->find('Default_Model_Configuracion', $inicioliquidacion['idConfiguracion']);
            $finarreglado = explode('/', $fin);
            $finarreglado = implode('-', $finarreglado);
            $fintstmp = strtotime($finarreglado);
            $fintstmp = strtotime("+1 day", $fintstmp);
            $findate = date('Y-m-d', $fintstmp);
            $ini->setValor($findate);
            $this->em->persist($ini);

            $this->em->flush();
            X\Msg::Success('Cálculo de liquidaciones exitoso.');
            return;
        } else {
            X\Msg::Failure("No existen registros para ese rango de fechas.");
            return;
        }
    }

    public function ajaxCambiarEstadoAction(){
        $usuario = $this->_request->getPost('id');
        $estado = $this->_request->getPost('estado');

        $qb = $this->em->createQueryBuilder();
        $liquidaciones = $qb
            ->select('l')
            ->from('Default_Model_Liquidacion', 'l')
            ->join('l.registros','r')
            ->join('r.responsable','res')
            ->join('res.profesor','p')
            ->join('p.usuario','u')
            ->groupBy('l.idLiquidacion')
            ->addGroupBy('u.idUsuario')
            ->where("u.idUsuario = '".$usuario."'")
            ->andWhere("l.estado = 'p'")
            ->getQuery()
            ->execute();

        foreach ($liquidaciones as $liquidar){
            $liquidar->setEstado($estado);
        }

        try{
            $this->em->flush();
            echo X\Msg::Escape(Zend_Json::encode(Array(
                "success" => true
            )));
        }
        catch(Exception $e){
            X\Msg::Failure("Error al actualizar el registro.");
        }
    }
}

